/* 
*模块化里的例子
*/
// import { asetTime, add } from './a'
import { bmoudle } from './b.ts'
let bName = 'name is ' + bmoudle
// add(1, 2)
// console.log(asetTime)
// console.log(bName)



/* 
*配置里面的例子
*/
// 明确this的位置 noImplicitThis
function fnc(this: Window) { //指明this为Windows
    console.log(this)
}

//严格检查空值(strictNullChecks)
let box1: Element = document.getElementById('box1');
//检测是否有box1元素，有的话再执行
box1?.addEventListener('click', function () {
    alert('click')
})



/* 
*ts的几大类型的例子
*/

//声明一个变量同时指定他的类型。
let a: number; //不能赋值为处number外的其他类型
a = 1;
//如果变量声明和赋值同时进行 ts可以自动对变量进行检测 如果复制其他类型值就会报错
let c = false;
c = true

//对象类型
let obj: object; //一般不用object，种类太多限制没必要，一般是限制内部的值
//｛属性名：属性值类型｝，在属性名称后面加？代表可选属性
let obj2: { name: string, age?: number }
obj2 = { name: 'Mary' }
//如果要求只要有name属性，其他随意增加([propName:string]任意属性名字)
let obj3: { name: string, [propName: string]: string }
obj3 = { name: 'aaa', age: '18' }

/* 
*定义函数的格式：（形参：类型，形参：类型...）=>返回值
*/
let dFnc: (a: number, b: number) => number;
dFnc = function (n1, n2) {
    return n1 + n2
}

//数组
//代表string类型的数组或者  let arr1:Array<string>
let arr1: string[];
arr1 = ['a', 'b', 'c']
//元组类型
//代表固定长度的数组
let h: [string, number]
h = ['a', 1]
//枚举
//代表定义了一个枚举类
enum Gender {
    Male = 0,
    Female = 1
}
let enumExample: { name: 'ck', gender: Gender.Male };
enumExample = { name: 'ck', gender: Gender.Male }
console.log(enumExample.gender === Gender.Male)

//类型的别名
//可以用type指定类型的别名
type myType = string;

let m: myType

